<?php
class Conf_unidades_negocio extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'conf_unidad_negocio');

    	$this->title = 'Configuraciones :: Unidad de Negocio';
		$this->CARPETA_VISTAS = 'configuraciones/';
		$this->nombre_entidad = 'Unidad de Negocio';
		$this->nombre_entidad_plural = 'Unidades de Negocio';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'unidad_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'unidad_edit_view';
		$this->pagina_ayuda = $this->template->getCarpetaAyuda() . 'ayuda_unidades';

		$this->genero_entidad = 'F';
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->nombre = $this->input->post('txt_nombre');
		$objEntidad->mail = $this->input->post('txt_mail');
		$objEntidad->telefono = $this->input->post('txt_telefono');
		//$objEntidad->logo = $this->input->post('txt_logo');
		
		
		if(!$objEntidad->exists()) $objEntidad->activo = TRUE;
		else {
			$activo = $this->input->post('chk_activo');
			$objEntidad->activo = $activo;
			
			if (!$activo) $objEntidad->fecha_baja = date($this->formatoFechaGuardar);
		}

		$objEntidad->zona_horaria = $this->input->post('sel_zonas');
		$objEntidad->numero_doc = $this->input->post('txt_numero_doc');
		$objEntidad->afip_tipodoc_id = $this->input->post('sel_documento');
		$objEntidad->afip_tiporesponsable_id = $this->input->post('sel_responsable');

		$datos['objEntidad'] = $objEntidad;

		// Objetos relacionados
		$objetosRel = array();
		$this->load->library('util_ubicacion');
		$id_ubicacion = is_numeric($this->input->post('txt_ubicacion')) ? $this->input->post('txt_ubicacion') : NULL;
		$objUbicacion = $this->util_ubicacion->cargarUbicacion($id_ubicacion, 
															   $this->input->post('f_txt_ciudad_id'),
															   $this->input->post('f_txt_calle_id'),
															   $this->input->post('txt_altura'),
															   $this->input->post('txt_piso'),
															   $this->input->post('txt_depto'));
		$objetosRel[] = $objUbicacion;

		$id_divisa = is_numeric($this->input->post('f_txt_moneda_id')) ? $this->input->post('f_txt_moneda_id') : NULL;
		$objetosRel[] = new Div_divisa($id_divisa);

		$id_unidad = is_numeric($this->input->post('f_txt_unidad_id')) ? $this->input->post('f_txt_unidad_id') : NULL;
		$objetosRel[] = new Prod_unidad($id_unidad);

		$id_localidad = is_numeric($this->input->post('f_txt_localidad_id')) ? $this->input->post('f_txt_localidad_id') : NULL;
		$objetosRel[] = new Ubic_localidad($id_localidad);

		$datos['objRelacionados'] = $objetosRel;

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		$obj_doc = new Afip_documento();
		$obj_doc->where('activo', TRUE);
		$obj_doc->order_by('descripcion', 'asc');
		$dataView['listado_documentos'] = $obj_doc->get_iterated();

		$obj_resp = new Afip_responsable();
		$obj_resp->where('activo', TRUE);
		$obj_resp->order_by('descripcion', 'asc');
		$dataView['listado_responsables'] = $obj_resp->get_iterated();
		
		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}

	public function ver_todos($dataView = array())
	{
		$dataView['sin_filtros'] = TRUE;
		parent::ver_todos($dataView);
	}

	public function editar($id_elemento = NULL, $opcion = 1)
	{
		$dataView = array();
		$objEntidad = $this->getObjeto($id_elemento);
		$edicionStandard = TRUE;
		switch ($opcion) {
			case 1:
				# Opción por defecto. Es la edición común
				break;

			case 2:
				# Cambiar logo
				$dataView['title'] = 'Cambiar Logo';
				$dataView['metodo_guardar'] = 'actualizar_logo';
				$dataView['pagina_editar'] =  $this->CARPETA_VISTAS . 'unidad_logo_edit_view';
				$controlador = strtolower($this->nombre_controlador);
				$dataView['nombre_controlador'] = $controlador;
				$dataView['metodo_subir_archivo'] = "cargarImagen(this.form.id, '$controlador')";
				$dataView['id_unidad'] = $id_elemento;
				$edicionStandard = FALSE;
				break;
			
			default:
				break;
		}
		$dataView['objEntidad'] = $objEntidad;
		
		if($edicionStandard) parent::_cargarFormEdicion($dataView);
		else parent::_loadFileUploadView($dataView, FALSE);
	}

	/* Método para guardar la información del registro. 
	 * Si todo salió correctamente, se muestra el listado de elementos actualizado.
	 * Si hubiera ocurrido un error, se vuelve a cargar el formulario de edición. 
	 * Se realiza aparte para darle a los controladores la posibilidad de sobreescribirlo y realizar
	 * distintas acciones de acuerdo al resultado de la operación. */
	public function guardar()
	{
		/* Necesito asegurarme que la ubicación que se relacionará a la unidad, esté guardada */
		$datos = $this->getObjetoDesdeForm();
		$objRelacionados = $datos['objRelacionados'];
		$objUbicacion = $objRelacionados[0];
		$this->load->library('util_ubicacion');
		$resultado = $this->util_ubicacion->guardar($objUbicacion);
		$objUbicacion = $resultado['objUbicacion'];
		$datos['objRelacionados'][] = $objUbicacion;

		$dataView = parent::guardarEntidad($datos);
		if($dataView['error'] != '') {
			// Falló el intento de guardar
			$this->_cargarFormEdicion($dataView, TRUE); 
		}
		else { 
			# Si la acción de guardado fue exitosa, le creo una nueva configuración de exportación a Excel (si no la tuviera ya)
			$objEntidad = $dataView['objEntidad'];

			$objConfExcel = new Conf_exportar_excel();
			$objConfExcel->where('conf_unidad_negocio_id', $objEntidad->id);
			$objConfExcel->get();
			if(!$objConfExcel->exists()) {
				$objConfExcel->conf_unidad_negocio_id = $objEntidad->id;
				
				$objConfExcel->trans_begin();
				$operacion_exitosa = $objConfExcel->save();
				if(!$operacion_exitosa && !$objConfExcel->valid)
				{ 
					# Falló la validación de datos de acuerdo a las reglas de los modelos
					$dataView['error'] = $objConfExcel->error->string; 
				}
				else
				{
					if ($objConfExcel->trans_status() === FALSE) # Si la transacción falló, hago un rollback 
						$objConfExcel->trans_rollback();
					else # Transacción exitosa, realizo el commit 
						$objConfExcel->trans_commit();

					# Almaceno todos los errores que hubieran podido ocurrir
					$dataView['error'] = $objConfExcel->error->string;
				}
			}

			$this->ver_todos($dataView); 
		}
	}

	public function actualizar_logo()
	{
		$ruta_img = './img/';
		// Intento guardar el archivo si hubiera
		$config['upload_path'] = $ruta_img;
		$config['allowed_types'] = 'jpg|jpge|png';
		
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload()) {
			echo 'Error: ' . $this->upload->display_errors();
		}
		else {
			$datos_archivo = $this->upload->data();
			
			$id_unidad = $this->input->post('txt_id');
			$objEntidad = $this->getObjeto($id_unidad);

			$path_logo = $ruta_img . $objEntidad->logo;
			// Si existiera foto previa, la elimino antes de guardar la nueva (si no fuera la imagen por defecto)
			if (file_exists($path_logo) && $objEntidad->logo != 'logo_empresa.png'){
				unlink($path_logo);
			}

			$objEntidad->where('id', $id_unidad)->update('logo', $datos_archivo['file_name']);

			$dataView['cargaCompleta'] = FALSE;
			$this->ver_todos($dataView);
		}
	}
}